import pandas as pd
from snapshot_pyppeteer import snapshot
from pyecharts.charts import Radar
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.render import make_snapshot
import json
import uuid
import numpy as np


def demo(excelPathJson):
    s1 = json.dumps(excelPathJson)
    dict1 = json.loads(s1)
    print(dict1)
    # 导入数据
    # thousands去除千分号,资产负债表
    data_all = pd.read_excel(dict1['dataAll'], thousands="，")
    data_L = pd.read_excel(dict1['dataL'], thousands="，")  # thousands去除千分号，利润表
    # thousands去除千分号，现金流量表
    data_X = pd.read_excel(dict1['dataX'], thousands="，")

#     # 获取项目名称列列名
#     balance = data_all.columns.values[0]  # 资产负债表
#     income = data_all.columns.values[0]  # 利润表
#     cash = data_X.columns.values[0]  # 现金流量表

# # 修改列名,将项目名称作为行索引
#     data_all.index = data_all[balance]  # 资产负债表,data_all.columns.values[0]获取第一列列名
#     data_L.index = data_L[income]  #利润表
#     data_X.index = data_X[cash]  #现金流量表

# # # 获取本期数据  标点识别有误，删除所有小数点
#     data_all[data_all.columns.values[2]] = data_all[data_all.columns.values[2]].str.replace('.', '')  # 资产负债表
#     data_all[data_all.columns.values[3]] = data_all[data_all.columns.values[3]].str.replace('.', '')
#     data_L[data_L.columns.values[2]] = data_L[data_L.columns.values[2]].str.replace('.', '')  # 利润表
#     data_X[data_X.columns.values[2]] = data_X[data_X.columns.values[2]].str.replace('.', '')  # 现金流量

# # 财务指标计算，当年数据
# # 计算权益乘数
#     EM=round(float(data_all[data_all[balance].str.contains('资产总')].values[:, 2])/float(data_all[data_all[balance].str.contains('权益合计')].values[:, 2]),2)
# # 基本每股收益
#     EPS =round(float(data_L[data_L[income].str.contains('基本每股')].values[:, 2])/100,2)
# #期末现金及现金等价物余额/流动负债合计， 现金比率
#     XJBL =round(float(data_X[data_X[balance].str.contains('末')].values[:, 2])/float(data_all[data_all[balance].str.contains('动负债合')].values[:, 2]),2)
# # 净利润/营业总收入 ,销售净利润
#     NPS = round(float(data_L[data_L[balance].str.contains('、净利润')].values[:, 2])/float(data_L[data_L[balance].str.contains('总收')].values[:, 2]),2)
# # 总资产周转率
#     EAS = round(float(data_L[data_L[balance].str.contains('总收')].values[:, 2])*2/float(data_all[data_all[balance].str.contains('资产总')].values[:, 2]),2)
    def anal(data, lis, z):
        balance = data.columns.values[0]  # 获取项目名称列列名
        data.index = data[balance]  # 修改列名,将项目名称作为行索引
        Z = data[balance].apply(str)  # 空值转为字符串
        a = data[Z.str.contains(lis)]
        # print("a.shape:", a.shape)
        if a.shape[0] == 0:
            vs = 0
        else:
            b = a.iloc[z]
            # print("b.shape:", b.shape)
            for j in b:
                if type(j) == str:
                    j = j.replace(".", "")
                    if j.isdigit() is True and float(j)-200 > 0:
                        vs = float(j)
                        break
                    else:
                        vs = 0
                else:
                    vs = 0
        return vs

    def po(x):
        if np.isinf(x) == True:
            x = 0
        else:
            x = x
        return x
    # 获取数据
    tass = anal(data_all, '资产总|债和所', z=0)  # 资产总额
    equity = anal(data_all, '权益合|益\\(或股东权益\\)合', z=-1)  # 所有者权益
    cash_end = anal(data_X, '末', z=0)  # 期末现金及现金等价物
    cur_lia = anal(data_all, "流动负债合计", z=0)  # 流动负债
    nin = anal(data_L, '、净利润|净利润|润\\(净', z=0)  # 净利润
    turnover = anal(data_L, '总收|业总|入', z=0)  # 营业总收入
    basic_eps = anal(data_L, '本每', z=0)  # 基本每股收益
    # print(tass ,equity,cash_end, cur_lia, nin,turnover,basic_eps)
    # 财务指标计算，当年数据
    EM = po(np.around(np.array(tass)/np.array(equity), 2))  # 权益乘数
    EPS = po(np.around(np.array(basic_eps)/100, 2))  # 基本每股收益
    XJBL = po(np.around(np.array(cash_end)/np.array(cur_lia), 2))  # 现金比率
    EAS = po(np.around(np.array(turnover)/np.array(tass), 2))  # 资产周转率
    NPS = po(np.around(np.array(nin)/np.array(turnover), 2))  # 销售净利润率
#  小程序输出数据 com_data为公司数据，avg_data为同行数据
    com_data = {"权益乘数：": EM, "基本每股收益：": EPS,
                "现金比率：": XJBL, "销售净利润：": NPS, "资产周转率：": EAS}
    avg_data = {"权益乘数：": 2.5, "基本每股收益：": 1.5,
                "现金比率：": 1, "销售净利润：": 0.061, "资产周转率：": 0.8}
    print(com_data)
    print(avg_data)
# 财务指标评价  （小程序中显示文字）
    financialIndexEvaluation = ""
    if EM < 2:  # 权益乘数
        print("能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力较弱，所有者权益占资产的比重较小，风险较大")
        financialIndexEvaluation = "能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力较弱，所有者权益占资产的比重较小，风险较大"
    elif 2 < EM < 3:
        print("能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力一般，所有者权益占资产的比重中等，风险一般")
        financialIndexEvaluation = "能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力一般，所有者权益占资产的比重中等，风险一般"
    else:
        print("能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力较强，所有者权益占资产的比重较大，风险较小，但也可能失去杠杆效应")
        financialIndexEvaluation = "能够评价企业偿债能力的指标。从当前数据来看，企业整体偿债能力较强，所有者权益占资产的比重较大，风险较小，但也可能失去杠杆效应"
# 基本每股收益
    basicEarningsPerShare = ""
    if EPS < 1:
        print("指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益较低，表明公司的盈利能力就较差")
        basicEarningsPerShare = "指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益较低，表明公司的盈利能力就较差"
    elif 1 < EPS < 1.5:
        print("指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益一般，属于行业平均水平")
        basicEarningsPerShare = "指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益一般，属于行业平均水平"
    else:
        print("指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益较高，表明公司的盈利能力较高")
        basicEarningsPerShare = "指企业应当按照属于普通股股东的当期净利润，除以发行在外普通股的加权平均数从而计算出的每股收益。公司基本每股收益较高，表明公司的盈利能力较高"
# 现金流量负债比率
    cashFlowLiabilityRatio = ""
    if XJBL < 0.6:
        print("企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，"
              "企业利用本期经营活动产生的现金流量偿还短期债务的能力较弱，企业可能没有足够的现金流偿还债务")
        cashFlowLiabilityRatio = "企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，企业利用本期经营活动产生的现金流量偿还短期债务的能力较弱，企业可能没有足够的现金流偿还债务"
    elif 0.6 < XJBL < 1.2:
        print("企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，企业利用本期经营活动产生的现金流量偿还短期债务的能力一般，企业现金流刚好能够抵偿债务")
        cashFlowLiabilityRatio = "企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，企业利用本期经营活动产生的现金流量偿还短期债务的能力一般，企业现金流刚好能够抵偿债务"
    else:
        print("企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，企业利用本期经营活动产生的现金流量偿还短期债务的能力较强，企业现金流比较充裕偿还债务")
        cashFlowLiabilityRatio = "企业经营活动现金净流量与流动负债的比例，其计算公式为现金流量负债比=经营活动现金净流量/流动负债从比率可以看出，企业利用本期经营活动产生的现金流量偿还短期债务的能力较强，企业现金流比较充裕偿还债务"
#  销售利润率
    salesProfitMargin = ""
    if NPS <= 5.5:
        print("经过一年的经营，企业的销售净利率较低，企业应当注意改进经营管理，提高盈利水平")
        salesProfitMargin = "经过一年的经营，企业的销售净利率较低，企业应当注意改进经营管理，提高盈利水平"
    elif 5.5 < NPS <= 6.5:
        print("经过一年的经营，企业的销售净利率一般，可以尝试改变销售策略，扩大销售")
        salesProfitMargin = "经过一年的经营，企业的销售净利率一般，可以尝试改变销售策略，扩大销售"
    else:
        print("经过一年的经营，企业的销售净利率较好，说明获取净利润的能力较强，注意保持")
        salesProfitMargin = "经过一年的经营，企业的销售净利率较好，说明获取净利润的能力较强，注意保持"
#  总资产周转率
    turnoverOfTotalAssets = ""
    if NPS <= 0.75:
        print("企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率较低，企业销售能力有待，可以尝试调整销售策略")
        turnoverOfTotalAssets = "企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率较低，企业销售能力有待，可以尝试调整销售策略"
    elif 0.75 < NPS <= 0.85:
        turnoverOfTotalAssets = "企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率中等，企业销售能力一般，可以尝试重整企业资产，使企业资产得到充分应用"
        print("总资产周转率是企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率中等，企业销售能力一般，可以尝试重整企业资产，使企业资产得到充分应用")
    else:
        turnoverOfTotalAssets = "企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率较高，企业销售能力较强，资产投资的效益较好。"
        print("总资产周转率是企业一定时期的销售收入净额与平均资产总额之比，它是衡量资产投资规模与销售水平之间配比情况的指标。从指标分析，企业资产使用效率较高，企业销售能力较强，资产投资的效益较好。")
# 分析可视化  生成雷达图
    v1 = [[EM, EPS, XJBL, NPS, EAS]]  # 公司财务数据
    #v11 = list(map(lambda x: po(x), v1[0]))
    c = (
        Radar(init_opts=opts.InitOpts(width="640px",
                                      height="360px", bg_color="#CCCCCD"))
        .add_schema(
            schema=[
                opts.RadarIndicatorItem(name="权益乘数"),
                opts.RadarIndicatorItem(name="基本每股收益"),
                opts.RadarIndicatorItem(name="现金比率"),
                opts.RadarIndicatorItem(name="销售净利润"),
                opts.RadarIndicatorItem(name="总资产周转率"),
                # opts.RadarIndicatorItem(name="市场（Marketing）", max_=25000),
            ],
            splitarea_opt=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
            ),
            textstyle_opts=opts.TextStyleOpts(color="#fff"),
        )
        .add(
            series_name="本年数据",
            # data=[[EM, EPS, XJBL, NPS, EAS]],# 公司财务数据
            data=v1,  # 公司财务数据
            linestyle_opts=opts.LineStyleOpts(color="#CD0001"),
            label_opts=opts.LabelOpts(color="#CD0001")
        )
        .add(
            series_name="行业水平",
            data=[[2.5, 1.5, 1, 0.061, 0.8]],  # 行业水平
            linestyle_opts=opts.LineStyleOpts(color="#5CACEE"),
            label_opts=opts.LabelOpts(color="#5CACEE")
        )
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="")
                         )
    )
    uid = str(uuid.uuid1())
    pngPath = str("png/Radar"+uid+".png")
    make_snapshot(snapshot, c.render(), pngPath)
    financialData = {
        'EM': EM,
        'EPS': EPS,
        'XJBL': XJBL,
        'NPS': NPS,
        'EAS': EAS
    }
    industryLevel = {
        'EM': 2.5,
        'EPS': 1.5,
        'XJBL': 1,
        'NPS': 0.061,
        'EAS': 0.8
    }
    description = {
        'financialIndexEvaluation': financialIndexEvaluation,
        'basicEarningsPerShare': basicEarningsPerShare,
        'cashFlowLiabilityRatio': cashFlowLiabilityRatio,
        'salesProfitMargin': salesProfitMargin,
        'turnoverOfTotalAssets': turnoverOfTotalAssets
    }

    conclusion = {'pngPath': pngPath, 'financialData': financialData,
                  'industryLevel': industryLevel, 'description': description}

    return conclusion
    # return {"pngPath": pngPath, "financialData": financialData, "industryLevel": industryLevel, "description": description}


"""
Gallery 使用 pyecharts 1.1.0
参考地址: https://echarts.baidu.com/examples/editor.html?c=radar

目前无法实现的功能:

1、雷达图周围的图例的 textStyle 暂时无法设置背景颜色
"""


if __name__ == '__main__':
    excelPathJson = {}
    excelPathJson['dataAll'] = 'xlsxFile/output8cc61d20-54a1-11eb-ac95-200db0166472.xlsx'
    excelPathJson['dataL'] = 'xlsxFile/output8d0437fe-54a1-11eb-ac95-200db0166472.xlsx'
    excelPathJson['dataX'] = 'xlsxFile/output8cf0be90-54a1-11eb-ac95-200db0166472.xlsx'
    pngPath = demo(excelPathJson)
